package br.com.jvet.entidade;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import br.com.jvet.constante.StatusPagamento;
import br.com.jvet.constante.TipoCartao;
import br.com.jvet.constante.TipoPagamento;
import br.com.jvet.constante.TipoServico;
import br.com.jvet.util.CommomUtils;

@Entity
@Table(name = "tbpagamento")
@SequenceGenerator(name = "pagamento_seq", sequenceName = "pagamento_seq", initialValue = 1, allocationSize = 1)
public class Pagamento implements Serializable {

	private static final long serialVersionUID = -8289140373970273158L;
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "pagamento_seq")
	private int codigo;
	@Column
	@Temporal(TemporalType.DATE)
	private Date data;
	@OneToOne
	private Cliente cliente;
	@OneToOne
	private Usuario usuario;
	@Column
	private boolean parcelado = false;
	@Column
	private int qtdParcela;
	@Column
	private String numeroCartao;
	@Column
	private String codigoSeguranca;
	@Column
	@Enumerated(EnumType.ORDINAL)
	private TipoPagamento tipoPagamento;
	@Column
	private double valorTotal;
	@Column
	private double valorParcela;
	@Column
	@Enumerated(EnumType.ORDINAL)
	private TipoServico tipoServico;
	@Column
	@Enumerated(EnumType.ORDINAL)
	private StatusPagamento statusPagamento;
	@Column
	@Temporal(TemporalType.DATE)
	private Date dataPagamento;
	@Column
	@Enumerated(EnumType.ORDINAL)
	private TipoCartao tipoCartao;
	@Column(length=150)
	private String observacao;


	public Pagamento() {
		super();
		cliente = new Cliente();
		usuario = new Usuario();
		statusPagamento = StatusPagamento.SEM_PAGAMENTO;
		data = new Date();
	}

	public int getCodigo() {
		return codigo;
	}

	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}

	public Date getData() {
		return data;
	}

	public void setData(Date data) {
		this.data = data;
	}

	public boolean isParcelado() {
		return parcelado;
	}

	public void setParcelado(boolean parcelado) {
		this.parcelado = parcelado;
	}

	public int getQtdParcela() {
		return qtdParcela;
	}

	public void setQtdParcela(int qtdParcela) {
		this.qtdParcela = qtdParcela;
	}

	public String getNumeroCartao() {
		return numeroCartao;
	}

	public void setNumeroCartao(String numeroCartao) {
		this.numeroCartao = numeroCartao;
	}

	public Date getDataPagamento() {
		return dataPagamento;
	}

	public void setDataPagamento(Date dataPagamento) {
		this.dataPagamento = dataPagamento;
	}

	public TipoPagamento getTipoPagamento() {
		return tipoPagamento;
	}

	public void setTipoPagamento(TipoPagamento tipoPagamento) {
		this.tipoPagamento = tipoPagamento;
	}

	public double getValorTotal() {
		return valorTotal;
	}

	public void setValorTotal(double valorTotal) {
		this.valorTotal = valorTotal;
	}

	public double getValorParcela() {
		if (qtdParcela > 0) {
			calculaParcelas();
		}
		return valorParcela;
	}

	public void setValorParcela(double valorParcela) {
		this.valorParcela = valorParcela;
	}

	public void calculaParcelas() {
		if (isParcelado()) {
			valorParcela = CommomUtils.arredondaValor(valorTotal / qtdParcela,
					2);
		}
	}

	public String getCodigoSeguranca() {
		return codigoSeguranca;
	}

	public void setCodigoSeguranca(String codigoSeguranca) {
		this.codigoSeguranca = codigoSeguranca;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public TipoServico getTipoServico() {
		return tipoServico;
	}

	public void setTipoServico(TipoServico tipoServico) {
		this.tipoServico = tipoServico;
	}

	public StatusPagamento getStatusPagamento() {
		return statusPagamento;
	}

	public void setStatusPagamento(StatusPagamento statusPagamento) {
		this.statusPagamento = statusPagamento;
	}

	public TipoCartao getTipoCartao() {
		return tipoCartao;
	}

	public void setTipoCartao(TipoCartao tipoCartao) {
		this.tipoCartao = tipoCartao;
	}

	public String getObservacao() {
		return observacao;
	}

	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}


	@Override
	public String toString() {
		return "Pagamento [codigo=" + codigo + ", data=" + data
				+ ", parcelado=" + parcelado + ", qtdParcela=" + qtdParcela
				+ ", numeroCartao=" + numeroCartao + ", tipoPagamento="
				+ tipoPagamento + ", valorTotal=" + valorTotal + "]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + codigo;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Pagamento other = (Pagamento) obj;
		if (codigo != other.codigo)
			return false;
		return true;
	}

	public Pagamento clone() {
		Pagamento pag = new Pagamento();
		pag.setCliente(cliente);
		pag.setCodigo(codigo);
		pag.setCodigoSeguranca(codigoSeguranca);
		pag.setData(data);
		pag.setDataPagamento(dataPagamento);
		pag.setNumeroCartao(numeroCartao);
		pag.setParcelado(parcelado);
		pag.setQtdParcela(qtdParcela);
		pag.setStatusPagamento(statusPagamento);
		pag.setTipoCartao(tipoCartao);
		pag.setTipoPagamento(tipoPagamento);
		pag.setTipoServico(tipoServico);
		pag.setUsuario(usuario);
		pag.setValorParcela(valorParcela);
		pag.setValorTotal(valorTotal);
		pag.setObservacao(observacao);
		return pag;
	}

}
